﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;

namespace Cataloger
{
    public partial class FrmNowyNosnik : Form
    {
		#region Fields (10) 

        FrmGlowna fGlowna;
        public static int iloscOkien=0;
        Katalog katalogDoBG;
        SortedList<string, string> listaDyskow = new SortedList<string, string>();
        DriveInfo nosnikDoBG;
        FrmSkanowanie skan;
        float stWielk = 0;
       // public static UstawieniaSkanowania us = new UstawieniaSkanowania();
        bool zeskanowano;

		#endregion Fields 

		#region Constructors (3) 

        public FrmNowyNosnik(Katalog kat, Nosnik n, FrmGlowna formaGlowna)
            : this(kat,formaGlowna)
        {
            comboBox1.Text = string.Format("{0} {1} ({2})", n.NazwaNapedu().Name, n.NazwaNapedu().VolumeLabel, n.NazwaNapedu().RodzajDysku()); 
            comboBox1.SelectedItem = comboBox1.Text;
            comboBox1.Refresh();
            comboBox1.Update();
            WykryjDyskSkanowany();
        }

        public FrmNowyNosnik(Katalog kat, FrmGlowna formaGlowna)
            : this(formaGlowna)
        {
            comboBox2.Text = kat.ToString();
            comboBox2.SelectedItem = kat;
            comboBox2.Refresh();
            comboBox1.Update();
            this.WykryjDyskSkanowany();
        }
        List<Cataloger.Plugins.AvailablePlugin> pluginyWlaczone = new List<Cataloger.Plugins.AvailablePlugin>();
        public FrmNowyNosnik(FrmGlowna formaGlowna)
        {
            if (iloscOkien < 1)
            {
                iloscOkien++;
                InitializeComponent();
                fGlowna = formaGlowna;
                cylinderGauge2.FillPercentage = 0;
                cylinderGauge3.FillPercentage = 0;
                statusLight1.Value = 0;
                DaneLaczneDyskow();
                wyswietlWszytskie();
                comboBox2.Items.AddRange(Globalne.WczytaneKatalogi.ToArray());
                toolTip1.ToolTipIcon = ToolTipIcon.Info;
                toolTip1.ToolTipTitle = "Inforacja o Pluginie";
                if (comboBox1.Items.Count > 0)
                {
                    comboBox1.SelectedIndex = 0;
                }
                if (comboBox2.Items.Count > 0)
                {
                    comboBox2.SelectedIndex = comboBox2.Items.Count - 1;

                }
                chlbPluginy.ItemCheck += new ItemCheckEventHandler(chlbPluginy_ItemCheck);

                
            }
            else
            {
              
                this.Close();
                this.Dispose();
            }


        }

        void chlbPluginy_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (e.NewValue == CheckState.Checked)
            {
                try
                {
                    pluginyWlaczone.Add(Globalne.pluginManager.AvailablePlugins[e.Index]);
                }
                catch { }
            }
            else
            {
                try
                {
                    pluginyWlaczone.Remove(Globalne.pluginManager.AvailablePlugins[e.Index]);
                }
                catch { }
            }
        }

		#endregion Constructors 

		#region Properties (1) 

        public BackgroundWorker BG
        {
            get
            {
                return backgroundWorker1;
            }
        }

		#endregion Properties 

		#region Methods (36) 

		// Private Methods (36) 

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //nosKat.Skanuj(us,backgroundWorker1,e);
            Skaner skana=e.Argument as Skaner;            
            skana.Skanuj(nosKat, backgroundWorker1, e);

        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            RaportSkanowania temp = e.UserState as RaportSkanowania;
            skan.LPliki = temp.IlePlikow.ToString("N0");
            skan.LFolderow = temp.IleFolderow.ToString("N0");
            skan.Rozmiar = temp.RozmiarZeskanowany.ToProperUnit();
            skan.LArchiwow = temp.IleArchiwow.ToString("N0");
            skan.LOpisow = temp.IleOpisow.ToString("N0");
            int progVal = (int)Math.Floor((temp.RozmiarZeskanowany)*stWielk);
            skan.IkonkaPowiadam.Text = "Skanowanie w toku: " + progVal + "%";
            skan.ProgressBarValue = progVal;
            skan.Text="Postęp skanowania: "+ progVal + "%";           
            
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            skan.Close();
            PrzywrocOkna();                      

            foreach (Control c in this.Controls)
            {
                c.Enabled = true;
            }           
            if (e.Cancelled == true)
            {
                MessageBox.Show("Z powodu przerwania skanowania wszystkie dane zeskanowane zostały odrzucnone","Przerwano skanowanie",MessageBoxButtons.OK,MessageBoxIcon.Error);
                katalogDoBG.UsunNosnik(nosKat);
                this.btnSkanuj.Text = "Skanuj";
                WykryjDyskSkanowany();
            }
            else
            {                                
                this.btnSkanuj.Text = "Aktualizuj";
                WykryjDyskSkanowany();

                Cataloger.Okna.Pomocnicze.FrmRaportSkanowania frmRaport = new Cataloger.Okna.Pomocnicze.FrmRaportSkanowania(nosKat);
                frmRaport.ShowDialog();
                Cataloger.Okna.Pomocnicze.FrmPodajOpisNosnika frmOpisNosnika = new Cataloger.Okna.Pomocnicze.FrmPodajOpisNosnika(nosKat);
                if (frmOpisNosnika.ShowDialog() == DialogResult.OK)
                {
                    nosKat.Opis = frmOpisNosnika.Opis;

                }
                fGlowna.Zakladi.SelectTab(fGlowna.TabKatalogi);
                fGlowna.DrzewoKatalogw.OdswiezNosnik(nosKat);
                

                this.btnSkanuj.Enabled = true;
                zeskanowano = true;
            }
        }

        private void PrzywrocOkna()
        {
            foreach (Form item in Application.OpenForms)
            {
                if (item.Visible == false)
                {
                    item.Show();
                }
            }
            WindowState = FormWindowState.Normal;
        }
        Nosnik nosKat;
        private void button1_Click(object sender, EventArgs e)
        {
            if (btnSkanuj.Text == "Skanuj")
            {
                UstawieniaSkanowania us= PobierzUstawienia();
                nosnikDoBG = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
                katalogDoBG = (Katalog)comboBox2.SelectedItem;
                string nazwaAl = "";
                FrmPodajNazweNosnika fPodajNazwa = new FrmPodajNazweNosnika(nosnikDoBG);
                if (fPodajNazwa.ShowDialog() == DialogResult.OK)
                {
                    nazwaAl = fPodajNazwa.Nazwa;
                    nosKat = new Nosnik(nosnikDoBG, katalogDoBG, nazwaAl);
                    this.btnSkanuj.Enabled = false;
                    this.btnSkanuj.Text = "SKANOWANIE";
                    skan = new FrmSkanowanie(comboBox1.SelectedItem.ToString().Substring(0, 3), backgroundWorker1);
                    foreach (Control c in this.Controls)
                    {
                        c.Enabled = false;
                    }

                    try
                    {
                        stWielk = ((float)100 / (float)nosnikDoBG.ZajeteMiejsca());
                    }
                    catch { stWielk = 100; }

                    Skaner skane = new Skaner(us);
              
                    backgroundWorker1.RunWorkerAsync(skane);
                                        
                    skan.Show();
                }

            }
            else if (btnSkanuj.Text == "Aktualizuj")
            {

            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (zeskanowano)
            {
                this.DialogResult = DialogResult.OK;
            }
            this.Close();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            fGlowna.TworzNowyKatalog(sender,e);
            comboBox2.Items.Clear();
            comboBox2.Items.AddRange(Globalne.WczytaneKatalogi.ToArray());
            comboBox2.SelectedIndex = comboBox2.Items.Count - 1;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            DriveInfo di = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
            di.WysunDyskCD();
            button4.Enabled = false;
            odswiez();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            odswiez();
        }

        private void button6_Click(object sender, EventArgs e)
        {
            DaneLaczneDyskow();
    
            odswiez();
        }

        private void button8_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                checkedListBox1.SetItemChecked(i, true);
            }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < checkedListBox1.Items.Count; i++)
            {
                checkedListBox1.SetItemChecked(i, false);
            }

        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                Cataloger.Okna.Podstawowe.FrmAutomatyzacjaKatalogowania fAuto = new Cataloger.Okna.Podstawowe.FrmAutomatyzacjaKatalogowania();
                if (fAuto.ShowDialog() == DialogResult.OK)
                {
                    checkBox1.Checked = true;
                }
                else
                {
                    checkBox1.Checked = false;
                }
            }
        }

        private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            DriveInfo di = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
            if (di.DriveType == DriveType.CDRom)
                button4.Enabled = true;
            else
                button4.Enabled = false;
            di.DrzewoKatalogow(treeView1);
            InfoDysk(di);
            di.WykresZajetosc(progressBar2);
            try
            {
                cylinderGauge2.FillPercentage = Convert.ToInt32(di.ProcentowoZajete());
            }
            catch { }
            try
            {
                cylinderGauge3.FillPercentage = Convert.ToInt32(di.ProcentowoWzgledemCalosci());
            }
            catch { }
            WykryjDyskSkanowany();

        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            WykryjDyskSkanowany();

        }

        private void DaneLaczneDyskow()
        {
            Drive.DyskiFizyczne(listaDyskow);
            textBox1.Text = Drive.OpisIleNosnikow();
            textBox2.Text = Drive.InformacjeORozmiarze();
            Drive.WykresZajetoscCalkowita(progressBar1);
            cylinderGauge1.FillPercentage = Drive.ProcentowoZajetosc();
            textBox3.Text = DyskiFizyczneInfo();
            wykresProcentowyUdzialMulti();

            WykresPieChartWolneZajete();

            wykresZajeteWolneMulti();

        }

        private void WykresPieChartWolneZajete()
        {
            pieChartControl1.Colors = new Color[] { Color.Red, Color.GreenYellow };
            pieChartControl1.Texts = new string[] { string.Format("{0}", Drive.ZajeteCalkowite().ToProperUnit()), string.Format("{0}", Drive.WolneCalkowite().ToProperUnit()) };
            pieChartControl1.Values = new decimal[] { Drive.ZajeteCalkowite(), Drive.WolneCalkowite(), };
            pieChartControl1.ToolTips = new string[] {"Zajęte","Wolne" };
            pieChartControl1.SliceRelativeDisplacements = new float[] { .1f,.1f };

            pieChartControl1.RightMargin = 1;
            pieChartControl1.BottomMargin = 1;
        }

        private void dodajDysk(DriveInfo di)
        {
            comboBox1.Items.Add(string.Format("{0} {1} ({2})",di.Name,di.VolumeLabel,di.RodzajDysku()));
        }

        private string DyskiFizyczneInfo()
        {
            StringBuilder opis = new StringBuilder();
            opis.AppendLine("Dysk fizyczny:\t\t\tLiczba partycji");
            opis.AppendLine("===========================================");
            HashSet<string> listaFiz = new HashSet<string>();
            foreach (KeyValuePair<string, string> dysk in listaDyskow)
            {
                listaFiz.Add(dysk.Value.Substring(19));
            }
            foreach (string s in listaFiz)
            {
                opis.AppendLine(s);
            }
            return opis.ToString();
        }

        private void filitracjaNosnikow()
        {
            comboBox1.Text = "";
            comboBox1.Items.Clear();
            if (radioButton1.Checked)
            {
                wyswietlWszytskie();
            }
            if (radioButton2.Checked)
            {
                wyswietlHDD();
            }
            if (radioButton3.Checked)
            {
                wyswietlCD();
            }
            if (radioButton4.Checked)
            {
                wyswietlFlash();
            }
            if (radioButton5.Checked)
            {
                wyswietlSieciowe();
            }
            if (radioButton6.Checked)
            {
                wyswietlDyskietki();
            }
        }

        private void FrmNowyNosnik_Leave(object sender, EventArgs e)
        {
            //zapisanie katalogu

        }

        private void InfoDysk(DriveInfo di)
        {
            richTextBox1.Text = "";
            try
            {
                richTextBox1.AppendText(listaDyskow[di.Name.Substring(0, 2)].Substring(0, 19) + "\n");
                richTextBox1.AppendText(listaDyskow[di.Name.Substring(0, 2)].Substring(19) + "\n");
            }
            catch { }
            richTextBox1.AppendText(di.OpisDysku());

        }

        private static void KatalogujNosnik(DriveInfo di, Katalog temp, string nazwa)
        {
            di.DodajDoKatalogu(temp, nazwa);

        }

        private void odswiez()
        {
            filitracjaNosnikow();
        }

        private void otwórzToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                Process.Start(treeView1.SelectedNode.FullPath);
            }
            catch { MessageBox.Show("Nie da się uruchomić"); }
        }

        private UstawieniaSkanowania PobierzUstawienia()
        {

            UstawieniaSkanowania us = new UstawieniaSkanowania();

            us.PluginyWlaczone = this.pluginyWlaczone;
           
           
            if (checkedListBox1.CheckedItems.Contains("ArchiwaZip"))
            {
                us.ArchiwaZip = true;
            }
            if (checkedListBox1.CheckedItems.Contains("ArchiwaRar"))
            {
                us.ArchiwaRar = true;
            }
            if (checkedListBox1.CheckedItems.Contains("Archiwa7z"))
            {
                us.Archiwa7z = true;
            }
            if (checkedListBox1.CheckedItems.Contains("ArchiwaIso"))
            {
                us.ArchiwaIso = true;
            }
            return us;
           
        }

        private void rbtns_CheckedChanged(object sender, EventArgs e)
        {
            filitracjaNosnikow();
        }

        private void Skanuj()
        {
            DriveInfo di = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
            Katalog temp = (Katalog)comboBox2.SelectedItem;
            KatalogujNosnik(di, temp, "");
        }

        private void wykresProcentowyUdzialMulti()
        {
            List<string> Nazwy = new List<string>();
            List<double> Wartosci = new List<double>();
            multiBarGauge1.BarMaxGap = Drive.DyskiGotowe().Length;
            multiBarGauge1.ScaleMax = 100;
            foreach (DriveInfo di in Drive.DyskiGotowe())
            {
                Wartosci.Add(di.ProcentowoWzgledemCalosci());
                Nazwy.Add(di.Name);
            }
            multiBarGauge1.BarLabels = Nazwy.ToArray();
            multiBarGauge1.BarValues = Wartosci.ToArray();
        }

        private void wykresZajeteWolneMulti()
        {
            List<string> Nazwy = new List<string>();
            List<double> Wartosci = new List<double>();
            multiBarGauge2.BarMaxGap = Drive.DyskiGotowe().Length;
            multiBarGauge2.ScaleMax = 100;
            foreach (DriveInfo di in Drive.DyskiGotowe())
            {
                Wartosci.Add(di.ProcentowoZajete());
                Nazwy.Add(di.Name);
            }
            multiBarGauge2.BarLabels = Nazwy.ToArray();
            multiBarGauge2.BarValues = Wartosci.ToArray();
        }

        private void WykryjDyskSkanowany()
        {
            try
            {
                if (comboBox1.SelectedItem.ToString() != "" && comboBox2.SelectedItem.ToString() != "")
                {
                    this.btnSkanuj.Enabled = true;
                    this.label3.Text = "Nieskanowano";
                    this.btnSkanuj.Text = "Skanuj";
                    statusLight1.Value = 1;
                    DriveInfo di = new DriveInfo(comboBox1.SelectedItem.ToString().Substring(0, 2));
                    try
                    {
                        foreach (Nosnik n in Globalne.WczytaneKatalogi[comboBox2.SelectedItem.ToString()].Nosniki)
                        {
                            if ((di.VolumeSerial() == n.NrSeryjny) && (di.TotalSize == n.Wielkosc))
                            {
                                this.label3.Text = "Zeskanowano " + n.DataAktulizacji.ToShortDateString();
                                this.btnSkanuj.Text = "Aktualizuj";
                                this.btnSkanuj.Enabled = true;
                                statusLight1.Value = 2;
                                break;
                            }
                            else
                            {
                                this.btnSkanuj.Enabled = true;
                                this.label3.Text = "Nieskanowano";
                                this.btnSkanuj.Text = "Skanuj";
                                statusLight1.Value = 1;
                            }
                        }
                    }
                    catch { }
                }
                else
                {
                    this.btnSkanuj.Enabled = false;
                    this.label3.Text = "";
                    statusLight1.Value = 0;
                }
            }
            catch { }



        }

        private void wyswietlCD()
        {
            foreach (DriveInfo di in Drive.DyskiOptyczne())
            {
                dodajDysk(di);
            }
        }

        private void wyswietlDyskietki()
        {
            foreach (DriveInfo di in Drive.DyskiWymienne())
            {
                if (di.RodzajDysku() == RodzajNosnika.Dyskietka)
                {
                    dodajDysk(di);
                }
            }
        }

        private void wyswietlFlash()
        {
            foreach (DriveInfo di in Drive.DyskiWymienne())
            {
                dodajDysk(di);
            }

        }

        private void wyswietlHDD()
        {
            foreach (DriveInfo di in Drive.DyskiTwarde())
            {
                dodajDysk(di);
            }
        }

        private void wyswietlSieciowe()
        {
            foreach (DriveInfo di in Drive.DyskiSieciowe())
            {
                dodajDysk(di);
            }
        }

        private void wyswietlWszytskie()
        {
            foreach (DriveInfo di in Drive.DyskiGotowe())
            {
                dodajDysk(di);
            }
        }

		#endregion Methods 

        private void FrmNowyNosnik_FormClosed(object sender, FormClosedEventArgs e)
        {
            iloscOkien--;
        }

        private void comboBox1_DropDown(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            filitracjaNosnikow();
            if (comboBox1.Items.Count > 0)
            {
                comboBox1.SelectedIndex = 0;

            }


        }

        private void comboBox2_DropDown(object sender, EventArgs e)
        {
            comboBox2.Items.Clear();
            comboBox2.Items.AddRange(Globalne.WczytaneKatalogi.ToArray());
            if (comboBox2.Items.Count > 0)
            {
                comboBox2.SelectedIndex = comboBox2.Items.Count - 1;

            }


        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            fGlowna.ZaladujKatalog(sender, e);
            comboBox2.Items.Clear();
            comboBox2.Items.AddRange(Globalne.WczytaneKatalogi.ToArray());
            if (comboBox2.Items.Count > 0)
            {
                comboBox2.SelectedIndex = comboBox2.Items.Count - 1;

            }
        }

        private void FrmNowyNosnik_Load(object sender, EventArgs e)
        {
            foreach (Cataloger.Plugins.AvailablePlugin plug in Globalne.pluginManager.AvailablePlugins)
            {
                chlbPluginy.Items.Add(plug.Instance.Nazwa);
            }
        }

        private void chlbPluginy_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (chlbPluginy.SelectedIndex >= 0)
            {
                lbPluginName.Text = Globalne.pluginManager.AvailablePlugins[chlbPluginy.SelectedIndex].Instance.Nazwa;
                lbPluginVer.Text = "(" + Globalne.pluginManager.AvailablePlugins[chlbPluginy.SelectedIndex].Instance.Wersja + ")";
                lbPluginAutor.Text = "by: " + Globalne.pluginManager.AvailablePlugins[chlbPluginy.SelectedIndex].Instance.Autor;
                lbPluginDescr.Text = Globalne.pluginManager.AvailablePlugins[chlbPluginy.SelectedIndex].Instance.Opis;
            }
        }

        private void button5_Click_1(object sender, EventArgs e)
        {
            try
            {
                Globalne.pluginManager.AvailablePlugins[chlbPluginy.SelectedIndex].Instance.Konfiguruj();
            }
            catch { }
        }

        private void button10_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < chlbPluginy.Items.Count; i++)
            {
                chlbPluginy.SetItemChecked(i, true);
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < chlbPluginy.Items.Count; i++)
            {
                chlbPluginy.SetItemChecked(i, false);
            }
        }
    }
}
